import axios from 'axios'
import type { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios'
import { ElMessage } from 'element-plus'
import { useUserStore } from '../stores/user'

// 创建axios实例
const service: AxiosInstance = axios.create({
    baseURL: import.meta.env.VITE_API_BASE_URL || 'http://localhost:8080/api',
    timeout: 10000,
    headers: {
        'Content-Type': 'application/json'
    }
})

// 请求拦截器
service.interceptors.request.use(
    (config) => {
        // 从store获取token
        const userStore = useUserStore()
        if (userStore.token) {
            // 添加token到请求头
            config.headers['Authorization'] = `Bearer ${userStore.token}`
        }
        return config
    },
    (error) => {
        console.error('请求错误:', error)
        return Promise.reject(error)
    }
)

// 响应拦截器
service.interceptors.response.use(
    (response: AxiosResponse) => {
        const res = response.data
        const url = response.config.url || ''

        // 如果是下载文件或特殊类型的响应，直接返回
        if (response.config.responseType === 'blob' || response.config.responseType === 'arraybuffer') {
            return response
        }

        // 根据后端返回的状态码判断请求是否成功
        if (res.code !== 200) {
            // 显示后端返回的错误消息 - 只在这里显示错误信息，避免重复显示
            // 对于登录相关请求，不显示错误消息，让调用方自行处理
            const isLoginRelatedRequest = url.includes('/login') || url.includes('/user/login')

            if (res.message && !isLoginRelatedRequest) {
                ElMessage({
                    message: res.message,
                    type: 'error',
                    duration: 6000, // 错误消息显示6秒
                    showClose: true // 显示关闭按钮
                })
            }

            // 处理特定错误代码
            if (res.code === 401) {
                // 未授权，清除用户信息
                const userStore = useUserStore()
                userStore.logout()

                // 只有当当前页面不是登录页时才重定向到登录页
                const currentPath = window.location.pathname
                if (currentPath !== '/login' && !currentPath.includes('/login')) {
                    // 使用 vue-router 进行导航而不是直接修改 location
                window.location.href = '/login'
                }
            }

            return Promise.reject(new Error(res.message || '请求失败'))
        }

        return res
    },
    (error) => {
        console.error('响应错误:', error)
        const url = error.config?.url || ''
        const isLoginRelatedRequest = url.includes('/login') || url.includes('/user/login')

        // 获取错误信息
        let errorMessage = '服务器异常，请稍后再试'

        if (error.response) {
            // 优先使用后端返回的错误信息
            if (error.response.data && error.response.data.message) {
                errorMessage = error.response.data.message
                // 显示后端返回的错误信息，但对登录请求不显示
                if (!isLoginRelatedRequest) {
                ElMessage({
                    message: errorMessage,
                    type: 'error',
                    duration: 6000, // 错误消息显示6秒
                    showClose: true // 显示关闭按钮
                })
                }
            } else {
                // 根据HTTP状态码设置错误信息
                switch (error.response.status) {
                    case 400:
                        errorMessage = '请求错误'
                        break
                    case 401:
                        errorMessage = '未授权，请重新登录'
                        // 清除用户信息
                        const userStore = useUserStore()
                        userStore.logout()

                        // 只有当当前页面不是登录页时才重定向到登录页
                        const currentPath = window.location.pathname
                        if (currentPath !== '/login' && !currentPath.includes('/login')) {
                            // 使用 vue-router 进行导航而不是直接修改 location
                        window.location.href = '/login'
                        }
                        break
                    case 403:
                        errorMessage = '拒绝访问'
                        break
                    case 404:
                        errorMessage = '请求的资源不存在'
                        break
                    case 500:
                        errorMessage = '服务器内部错误'
                        break
                    default:
                        errorMessage = `请求失败 (${error.response.status})`
                }
                // 只在没有后端返回的具体错误信息时显示前端的错误提示，且对登录请求不显示
                if (!isLoginRelatedRequest) {
                ElMessage({
                    message: errorMessage,
                    type: 'error',
                    duration: 6000, // 错误消息显示6秒
                    showClose: true // 显示关闭按钮
                })
                }
            }
        } else if (error.request) {
            // 请求已发送但未收到响应
            errorMessage = '网络异常，服务器未响应'
            if (!isLoginRelatedRequest) {
            ElMessage({
                message: errorMessage,
                type: 'error',
                duration: 6000, // 错误消息显示6秒
                showClose: true // 显示关闭按钮
            })
            }
        } else {
            // 请求设置有问题
            errorMessage = error.message
            if (!isLoginRelatedRequest) {
            ElMessage({
                message: errorMessage,
                type: 'error',
                duration: 6000, // 错误消息显示6秒
                showClose: true // 显示关闭按钮
            })
            }
        }

        return Promise.reject(error)
    }
)

// 创建请求方法
const request = {
    get<T = any>(url: string, config?: AxiosRequestConfig): Promise<T> {
        return service.get(url, config)
    },

    post<T = any>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T> {
        return service.post(url, data, config)
    },

    put<T = any>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T> {
        return service.put(url, data, config)
    },

    delete<T = any>(url: string, config?: AxiosRequestConfig): Promise<T> {
        return service.delete(url, config)
    }
}

export default request 